package com.sp.fresh_produce.common;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.File;
import java.util.Set;

import static java.util.Arrays.asList;
import static java.util.stream.Collectors.toSet;

/**
 * 项目中的常量定义类
 * <p>
 * 包含项目中使用的各种常量，如会话键、排序规则等
 */
@Component
public class Constant {
    /**
     * 用户会话键名
     */
    public static final String USER_SESSION_KEY = "user";

    /**
     * 文件上传目录
     */
    public static String FILE_UPLOAD_DIR;

    @Value("${file.upload.dir}")
    public void setFileUploadDir(String fileUploadDir) {
        String dir = fileUploadDir == null ? "" : fileUploadDir.trim();
        if (!dir.endsWith("/") && !dir.endsWith("\\")) {
            dir = dir + File.separator;
        }
        FILE_UPLOAD_DIR = dir;
    }

    /**
     * 商品列表排序规则相关常量
     */
    public interface ProductListOrderBy {
        /**
         * 价格排序规则集合，支持价格升序和价格降序
         */
        Set<String> PRICE_ASC_DESC = asList("price_desc", "price_asc").stream().collect(toSet());
        
        /**
         * 名称排序规则集合，支持名称升序和名称降序
         */
        Set<String> NAME_ASC_DESC = asList("name_asc", "name_desc").stream().collect(toSet());
        
        /**
         * 创建时间排序规则集合，支持创建时间升序和降序
         */
        Set<String> CREATE_TIME_ASC_DESC = asList("create_time_asc", "create_time_desc").stream().collect(toSet());
        
        /**
         * 更新时间排序规则集合，支持更新时间升序和降序
         */
        Set<String> UPDATE_TIME_ASC_DESC = asList("update_time_asc", "update_time_desc").stream().collect(toSet());
        
        /**
         * 库存排序规则集合，支持库存升序和降序
         */
        Set<String> STOCK_ASC_DESC = asList("stock_asc", "stock_desc").stream().collect(toSet());
        
        /**
         * 所有支持的排序规则集合
         */
        Set<String> ALL_SORT_RULES = asList(
            "price_asc", "price_desc",
            "name_asc", "name_desc", 
            "create_time_asc", "create_time_desc",
            "update_time_asc", "update_time_desc",
            "stock_asc", "stock_desc"
        ).stream().collect(toSet());
    }


    /**
     *  商品上架和下架状态
     */
    public interface ProductStatus {
        /**
         * 商品下架
         */
        Integer NOT_SALE = 0;
        /**
         * 商品上架
         */
        Integer SALE = 1;
    }

    /**
     *  购物车是否选择状态
     */
    public interface CartChecked {
        /**
         * 未选择
         */
        Integer UN_CHECKED = 0;
        /**
         * 已选择
         */
        Integer CHECKED = 1;
    }

    /**
     *  订单状态
     */
    public interface OrderStatus {
        /**
         * 用户已取消
         */
        Integer CANCELED = 0;
        
        /**
         * 未付款
         */
        Integer NOT_PAID = 10;
        
        /**
         * 已付款
         */
        Integer PAID = 20;
        
        /**
         * 已发货
         */
        Integer DELIVERED = 30;
        
        /**
         * 交易完成
         */
        Integer FINISHED = 40;
        
        /**
         * 获取状态码
         *
         * @return 状态码
         */
        Integer getCode();
        
        /**
         * 获取状态值描述
         *
         * @return 状态值描述
         */
        String getValue();
    }
    
    /**
     * 实现订单状态枚举
     */
    public enum OrderStatusEnum implements OrderStatus {
        /**
         * 用户已取消
         */
        CANCELED(Constant.OrderStatus.CANCELED, "订单已取消"),
        
        /**
         * 未付款
         */
        NOT_PAID(Constant.OrderStatus.NOT_PAID, "未付款"),
        
        /**
         * 已付款
         */
        PAID(Constant.OrderStatus.PAID, "已付款"),
        
        /**
         * 已发货
         */
        DELIVERED(Constant.OrderStatus.DELIVERED, "已发货"),
        
        /**
         * 交易完成
         */
        FINISHED(Constant.OrderStatus.FINISHED, "交易完成");
        
        private final Integer code;
        private final String value;
        
        OrderStatusEnum(Integer code, String value) {
            this.code = code;
            this.value = value;
        }
        
        @Override
        public Integer getCode() {
            return code;
        }
        
        @Override
        public String getValue() {
            return value;
        }
        
        /**
         * 根据状态码获取状态枚举
         *
         * @param code 状态码
         * @return 订单状态枚举
         */
        public static OrderStatusEnum codeOf(Integer code) {
            for (OrderStatusEnum status : values()) {
                if (status.getCode().equals(code)) {
                    return status;
                }
            }
            throw new RuntimeException("没有找到对应的订单状态");
        }
    }
}